home *** CD-ROM | disk | FTP | other *** search
/ NetNews Offline 2 / NetNews Offline Volume 2.iso / news / comp / lang / c-part1 / 6328 < prev    next >
Encoding:
Text File  |  1996-08-05  |  2.2 KB  |  76 lines

  1. Path: rcp6.elan.af.mil!rscernix!danpop
  2. From: danpop@mail.cern.ch (Dan Pop)
  3. Newsgroups: comp.lang.c
  4. Subject: Re: Help With Pointers
  5. Date: 23 Feb 96 12:18:18 GMT
  6. Organization: CERN European Lab for Particle Physics
  7. Message-ID: <danpop.825077898@rscernix>
  8. References: <4g67cj$6cv@hobbes.compusult.nf.ca> <4ggvnq$2bt@newshost.cyberramp.net>
  9. NNTP-Posting-Host: ues5.cern.ch
  10. X-Newsreader: NN version 6.5.0 #7 (NOV)
  11.  
  12. In <4ggvnq$2bt@newshost.cyberramp.net> sinan@cyberramp.net (John Noland) writes:
  13.  
  14. >In article <4g67cj$6cv@hobbes.compusult.nf.ca>, bryan@public.compusult.nf.ca says...
  15. >>
  16. >>Is there any way to assign a char pointer to a float pointer?
  17. >>
  18. >>I had to do some byte rotation on binary data.  I rotated 
  19. >>the characters and know want to point a float at the first
  20. >>character position to read back a 4 byte float.
  21.  
  22. float *p = (float *)buff;
  23.  
  24. This will work on the PC, but it's not a great idea, because buff may not
  25. be correctly aligned for a float.  On the PC this will only cause a
  26. performance penalty, on other platforms the program will crash and burn
  27. with a bus error.
  28.  
  29. The correct way is to do it the other way round:
  30.  
  31. float f;
  32. unsigned char *p = (unsigned char *) &f;
  33.  
  34. Now you can use p to copy the bytes in, fixing the ordering during the
  35. copy operation (or after) and when you're done, f will contain the right
  36. value.
  37.  
  38. >>I'am actually trying to read SGI binary data with a PC.  I've been told
  39. >>that the SGI bytes ( not bits ) are rotated versus a PC.  Any help 
  40. >>would be appreciated. Are the bytes rotated?
  41.  
  42. No, you have to rotate them yourself :-)
  43.  
  44. >variable. So, you might wind up with something like this;
  45. >
  46. >char    SGI_source[4];
  47. >union {
  48. >    char    d1[4];
  49. >    float    d2;
  50. >} dest;
  51. >
  52. >dest.d1[1] = SGI_source[2];
  53. >dest.d2[2] = SGI_source[1];
  54.       ^^
  55.       ??
  56. >
  57. >or however the byte rotation needs to be done.
  58.  
  59. Using a union for this purpose is a bit of overkill (and, as you just
  60. proved, error prone :-), a pointer is all that is needed:
  61.  
  62. float f;
  63. unsigned char *p = (unsigned char *) &f, buff[sizeof(float)];
  64. int i;
  65.  
  66. p += sizeof(float);
  67. for(i = 0; i < sizeof(float); i++)
  68.     *(--p) = buff[i];  /* the parentheses are actually superfluous :-) */
  69.  
  70. Dan
  71. --
  72. Dan Pop
  73. CERN, CN Division
  74. Email: danpop@mail.cern.ch 
  75. Mail:  CERN - PPE, Bat. 31 R-004, CH-1211 Geneve 23, Switzerland
  76.